import argparse

import cv2
import numpy as np


def get_args():
    parser = argparse.ArgumentParser("Image to ASCII")
    parser.add_argument("--输入", type=str, default="data/input.jpg", help="原图文件路径")
    parser.add_argument("--output", type=str, default="data/output.html", help="生成 html 文件路径")
    parser.add_argument("--mode", type=str, default="complex", choices=["simple", "complex"],
                        help="10 or 70 different characters")
    parser.add_argument("--num_cols", type=int, default=150, help="number of character for output's width")
    args = parser.parse_args()
    return args

def rgb_to_hex(rgb):
    return '#{0:02x}{1:02x}{2:02x}'.format(*rgb)

def main(opt):
    if opt.mode == "simple":
        字符列表 = '@%#*+=-:. '
    else:
        字符列表 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
    字符种数 = len(字符列表)
    列数 = opt.num_cols
    图片 = cv2.imread(opt.输入)
    图片 = cv2.cvtColor(图片, cv2.COLOR_BGR2RGB)
    图高, 图宽, _ = 图片.shape
    格宽 = 图宽 / opt.num_cols
    格高 = 2 * 格宽
    行数 = int(图高 / 格高)
    if 列数 > 图宽 or 行数 > 图高:
        print("Too many columns or rows. Use default setting")
        格宽 = 6
        格高 = 12
        列数 = int(图宽 / 格宽)
        行数 = int(图高 / 格高)

    输出文件 = open(opt.output, 'w')
    输出文件.write('<span style="font-size:20px"><pre>')
    for 行号 in range(行数):
        for 列号 in range(列数):
            局部图 = 图片[int(行号 * 格高) : min(int((行号 + 1) * 格高), 图高),
                        int(列号 * 格宽) : min(int((列号 + 1) * 格宽), 图宽)]
            局部平均颜色 = np.sum(np.sum(局部图, axis=0), axis=0) / (格高 * 格宽)
            局部平均颜色 = tuple(局部平均颜色.astype(np.int32).tolist())
            输出文件.write(
                '<font color="' + rgb_to_hex(局部平均颜色) + '">'
                + 字符列表[min(int(np.mean(局部图) * 字符种数 / 255), 字符种数 - 1)]
                + '</font>')
            
        输出文件.write("<br />")
    输出文件.write('</pre></span>')
    输出文件.close()


if __name__ == '__main__':
    opt = get_args()
    main(opt)